#include "CargoABM.h"
using namespace ABM;

//Cuando llamo al constructor de IAbm , le seteo el nombre del ABM en el que estoy.
CargoABM::CargoABM() :
	IAbm("Cargo") {
	this->manejadorCargo = new ManejadorCargo();

}

bool CargoABM::alta() {

	bool resultado = false;
	bool existeCargoIngresado = false;
	Cargo* cargo = new Cargo();

	string nombreCargo;
	cout << "Ingrese el nombre del CARGO PRINCIPAL: " << endl;
	getline(cin, nombreCargo);
	nombreCargo = Utils::aMinuscula(nombreCargo);

	existeCargoIngresado = manejadorCargo->existe(nombreCargo);
	if (!existeCargoIngresado) {
		cargo->setNombre(nombreCargo);
		int cargosParaAgregar = 0;
		string nombreCargoAsociado = "";
		cout << "Ingrese cuantos CARGOS ASOCIADOS desea agregar: ";
		cin >> cargosParaAgregar;
		cin.ignore(numeric_limits<streamsize>::max(), '\n');

		for (int i = 0; i < cargosParaAgregar; i++) {
			cout << "Ingrese el nombre del CARGO nro " << (i + 1)
					<< " a agregar: ";
			getline(cin, nombreCargoAsociado);
			nombreCargoAsociado = Utils::aMinuscula(nombreCargoAsociado);
			existeCargoIngresado = manejadorCargo->existe(nombreCargoAsociado);
			if (existeCargoIngresado) {
				cargo->agregarCargoAsociado(nombreCargoAsociado);
			} else {
				cout<< "Cargo Asociado no existe o no se encuentra dado de alta."<< endl;
				break;
			}
		}
		resultado = this->manejadorCargo->alta(cargo);
	}

	delete cargo;

	return resultado;
}

bool CargoABM::baja() {

	bool resultado = false;
	Cargo* cargo = new Cargo();

	string nombreCargo;
	cout << "Ingrese el nombre del CARGO PRINCIPAL: " << endl;
	getline(cin, nombreCargo);
	nombreCargo = Utils::aMinuscula(nombreCargo);

	if (manejadorCargo->existe(nombreCargo)) {
		cargo = manejadorCargo->recuperar(nombreCargo);
		if (cargo->getCargosAsociados()->size() > 0) {
			resultado = manejadorCargo->baja(cargo);
		} else {
			cout << "No se pueden borrar Cargos Asociados." << endl;
			resultado = false;
		}
	}
	delete cargo;

	return resultado;

}

bool CargoABM::modificacion() {
	bool resultado;

	string nombreCargo;
	cout << "Ingrese el nombre del CARGO PRINCIPAL: " << endl;
	getline(cin, nombreCargo);
	nombreCargo = Utils::aMinuscula(nombreCargo);
	Cargo* cargo = this->manejadorCargo->recuperar(nombreCargo);
if (cargo->getCargosAsociados()->size() > 0) {
		string cargoAsociadoModif = "";
		int opcionCargoAsociado = 0;
		cout << "Los CARGOS ASOCIADOS son: " << endl;
		for (unsigned int i = 1; i <= cargo->getCargosAsociados()->size(); i++) {
			cout << i << " - "
					<< cargo->getCargosAsociados()->at(i - 1)->getNombre()
					<< endl;
		}
		cout << "Ingrese el numero de Cargo a Modificar: ";
		cin >> opcionCargoAsociado;
		cin.ignore(numeric_limits<streamsize>::max(), '\n');
		string nombreCargoAnterior = cargo->getCargosAsociados()->at(
				opcionCargoAsociado)->getNombre();
		if ((opcionCargoAsociado >= 1) && (opcionCargoAsociado
				<= cargo->getCargosAsociados()->size())) {
			cout << "Ingrese CARGO ASOCIADO: ";
			getline(cin, cargoAsociadoModif);
			if (manejadorCargo->existe(cargoAsociadoModif)) {
				cargoAsociadoModif = Utils::aMinuscula(cargoAsociadoModif);
				cargo->getCargosAsociados()->at(opcionCargoAsociado - 1)->setNombre(
						cargoAsociadoModif);
				resultado = manejadorCargo->modificacion(cargo,
						nombreCargoAnterior);
			} else {
				cout
						<< "Cargo que desea modificar no se encuentra en la base de Cargos"
						<< endl;
				resultado = false;
			}
		} else {
			cout << "Opcion incorrecta." << endl;
			getchar();
			resultado = false;
		}
	}else{
		cout << "No existen cargos que se puedan modificar"<< endl;
		resultado = false;
	}
	delete cargo;

	return resultado;

}

void CargoABM::altaMasiva() {
	ArchivoAltasMasivas* arch = new ArchivoAltasMasivas("cargoCargaMasiva.txt");
	string linea;
	Cargo* cargo;
	vector<string>* campos;
	string nombreCargoAsociado;

	linea = arch->leerLinea();

	while (!arch->finDeArchivo()) {
		cargo = new Cargo();
		campos = Parser::separarCampos(&linea, separadorCampos);
		//el primero es el cargo, los demás, si hay, son los cargos asociados
		Parser::reemplazarCaracter(&campos->at(0), separadorPalabras, blanco);
		cargo->setNombre(Utils::aMinuscula(campos->at(0)));

		//a partir de la posicion 1 son cargos asociados
		for (unsigned int i = 1; i < campos->size(); ++i) {
			Parser::reemplazarCaracter(&campos->at(i), separadorPalabras, blanco);
			nombreCargoAsociado = Utils::aMinuscula(campos->at(i));
			if(this->manejadorCargo->existe(nombreCargoAsociado)){
				cargo->agregarCargoAsociado(nombreCargoAsociado);
			}
		}
		this->manejadorCargo->alta(cargo);
		delete cargo;
		delete campos;
		linea = arch->leerLinea();
		this->log->escribir("Se genero Alta Masiva de Cargo.");
	}

	delete arch;
}

bool CargoABM::listar(){
	bool listOK= false;
	if (this->manejadorCargo->listarTodos()){
		system("chmod 755 ../TPVotoElectronico/Reportes/ListadoCargos.txt");
		system("gedit ../TPVotoElectronico/Reportes/ListadoCargos.txt");
		listOK = true;
	}else{
		cout << "No se encuentra ningun Listado de Cargos.";
		cout << "Asegurese que se encuentran cargos cargados" << endl;
	}
	return listOK;
}

CargoABM::~CargoABM() {
	delete this->manejadorCargo;

}
